package com.ihy.dao.hibernate;

import com.ihy.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

/**
 * 用户信息数据处理层
 * <p>
 * Repository注解：
 * 被注解的类是“存储库”，最初设计定义为“用于封装存储、检索和搜索行为（模拟对象集合）的机制”。
 * 实现传统javaee模式（如“数据访问对象”）的团队也可以将这个原型应用于DAO类，不过在这样做之前，应该注意理解数据访问对象和DDD样式存储库之间的区别。
 */
@Repository
public interface DaoUser extends JpaRepository<User, Object> {
    //登录方法
    User getByUsername(String username);

    /**
     * 修改方法
     * <p>
     * Transactional注解：
     * 描述单个方法或类的事务属性。
     * 在类级别，此注解作为默认值应用于声明类及其子类的所有方法。注意，它不适用于类层次结构上的祖先类；方法需要在本地重新声明，以便参与子类级别的注解。
     * <p>
     * Modifying注解：
     * 指示应将查询方法视为修改查询，因为它会更改执行查询的方式。只有在通过查询注解定义的查询方法上使用时，才考虑使用此注解。
     * 它不应用于自定义实现方法或从方法名称派生的查询，因为它们已经控制了基础数据访问api，或者指定是否通过名称进行修改。
     * 需要“@Modifying”注解的查询包括INSERT、UPDATE、DELETE和DDL语句。
     * <p>
     * Query注解：
     * 直接在存储库方法上声明finder查询的注解
     */
    @Transactional
    @Modifying
    @Query("update User an set an.username=?2,an.password=?3 where an.id=?1")
    int update(Integer id, String username, String password);

    //根据手机号查找用户名
    User getByPhone(String phone);
}
